package com.powernode.config;

import com.powernode.constant.Constants;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.CustomExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;

/**
 * 延迟交换机和队列配置类
 * 用于实现秒杀订单的延迟处理（如超时未支付自动取消）
 */
@Configuration
public class DelayRabbitConfig {
    /*
     * 声明延迟交换机
     * 类型为 x-delayed-message（RabbitMQ延迟消息插件提供的特殊类型）
     */
    @Bean
    public CustomExchange delayExchange() {
        HashMap<String, Object> args = new HashMap<>();
        // 设置延迟交换机的路由类型为 direct（与普通direct交换机行为一致）
        args.put("x-delayed-type", "direct");

        /**
         * 创建自定义交换机参数说明：
         * 1. 交换机名称：Constants.EXCHANGE_DELAY_NAME（从常量类获取，通常为 "exchange.order.delay"）
         * 2. 交换机类型："x-delayed-message"（延迟消息专用类型）
         * 3. durable: true - 持久化交换机，服务重启后不丢失
         * 4. autoDelete: false - 不自动删除，需手动删除
         * 5. arguments: 额外参数（这里指定了延迟消息的路由类型）
         */
        return new CustomExchange(Constants.EXCHANGE_DELAY_NAME, "x-delayed-message", true, false, args);
    }

    /**
     * 声明延迟队列
     * 用于暂存需要延迟处理的订单消息
     */
    @Bean
    public Queue delayQueue() {
        /**
         * 创建队列参数说明：
         * 1. 队列名称：Constants.QUEUE_DELAY_NAME（从常量类获取，通常为 "queue.order.delay"）
         * 2. durable: true - 持久化队列，服务重启后消息不丢失
         */
        return new Queue(Constants.QUEUE_DELAY_NAME, true);
    }

    /**
     * 绑定延迟队列到延迟交换机
     * 建立交换机、路由键、队列之间的映射关系
     */
    @Bean
    public Binding delayBinding() {
        /**
         * 绑定关系说明：
         * 1. 将 delayQueue() 队列绑定到 delayExchange() 交换机
         * 2. 使用路由键 Constants.ROUTING_KEY_DELAY_NAME（通常为 "key.order.delay"）
         * 3. noargs() - 无额外参数
         */
        return BindingBuilder.bind(delayQueue()).to(delayExchange()).with(Constants.ROUTING_KEY_DELAY_NAME).noargs();
    }
}
